#include "music.h"

#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
#include <unistd.h>
using namespace std;

pid_t bgm_pid = -1;
bool bgm_playing = false;
const char *bgm_path = "/music/bgm.mp3";

// 清理音乐进程
void cleanup_bgm()
{
    if (bgm_pid > 0)
    {
        kill(bgm_pid, SIGTERM);
        waitpid(bgm_pid, NULL, 0);
        bgm_pid = -1;
        bgm_playing = false;
        cout << "背景音乐已停止" << endl;
    }
}

// 播放背景音乐（循环播放）
void play_background_music()
{
    // 如果已经在播放，先停止
    cleanup_bgm();

    // 设置音量（使用amixer）
    // system("amixer set PCM 50% > /dev/null 2>&1");

    bgm_pid = fork();
    if (bgm_pid == 0)
    {
        // 子进程：使用madplay循环播放背景音乐
        // -r 选项表示循环播放
        execl("/usr/bin/madplay", "madplay", "-r", bgm_path, NULL);

        // 如果execl失败，尝试使用其他播放方式
        cout << "madplay执行失败，尝试其他播放方式..." << endl;
        exit(1);
    }
    else if (bgm_pid > 0)
    {
        bgm_playing = true;
        cout << "开始播放背景音乐: " << bgm_path << endl;
    }
    else
    {
        cout << "创建音乐进程失败" << endl;
    }
}

// 检查音乐进程状态并重新启动（如果异常退出）
void check_bgm_status()
{
    if (bgm_playing && bgm_pid > 0)
    {
        int status;
        pid_t result = waitpid(bgm_pid, &status, WNOHANG);

        if (result > 0)
        {
            // 进程已退出，重新启动
            cout << "背景音乐进程异常退出，重新启动..." << endl;
            bgm_playing = false;
            bgm_pid = -1;
            play_background_music();
        }
    }
}

void play_eat_sound()
{
    pid_t sound_pid = fork();
    if (sound_pid == 0)
    {
        // 子进程：播放音效（不循环）
        execl("/usr/bin/madplay", "madplay", "/music/eat.mp3", NULL);
        
    }
    else if (sound_pid > 0)
    {
        // 父进程：立即返回，不等待音效播放完成
        // 使用非阻塞方式等待，避免阻塞主线程
        int status;
        pid_t result = waitpid(sound_pid, &status, WNOHANG);
        
        if (result > 0) {
            // 音效播放完成，清理进程
            waitpid(sound_pid, NULL, 0);
        } else {
            // 音效还在播放，创建新线程等待（可选）
            // 这里简单处理，让进程自然结束
        }
        
        // cout << "播放吃食物音效" << endl;
    }
    else
    {
        cout << "创建音效进程失败" << endl;
    }
}


// 信号处理函数，用于优雅退出
void signal_handler(int sig)
{
    cout << "接收到信号 " << sig << "，清理资源..." << endl;
    cleanup_bgm();
    exit(0);
}